import { deepCopy } from '@/utils/lib.js'

export default {
	data() {
		return {
			allBoundary: [],
			moveItemData: null,
			activeIndex: -1,
			
			moveTop: 0,
			moveLeft: 0,
			itemWidth: 0,
			itemHeight: 0,
			showMoveItem: false,
			
			dealyTimer: null,
			dealy: 50
		}
	},
	computed: {
		moveStyle() {
			return {
				left: this.moveLeft + 'px',
				top: this.moveTop + 'px',
				width: this.itemWidth + 'px',
				height: this.itemHeight + 'px',
				visibility: this.showMoveItem ? 'unset' : 'hidden'
			}
		}
	},
	watch: {
		sortList: {
			handler() {
				this.moveItemData = this.sortList[0]
				this.$nextTick(function() {
					this.getAllBoundary()
				})
			},
			deep: true,
			immediate: true
		}
	},
	methods: {
		getAllBoundary() {
			const that = this
			uni.createSelectorQuery()
				.in(this)
				.selectAll('.wk-drag-sort-item')
				.boundingClientRect(data => {
					console.log('getAllBoundary: ', data)
					that.allBoundary = data.map(item => {
						return {
							...item,
							beginX: item.left,
							endX: item.left + item.width,
							beginY: item.top,
							endY: item.top + item.height,
						}
					})
				})
				.exec();
		},
		
		handleTouchstart(evt, index) {
			if (this.dealyTimer) {
				clearTimeout(this.dealyTimer)
				this.dealyTimer = null
			}
			this.dealyTimer = setTimeout(() => {
				const query = uni.createSelectorQuery().in(this);
				query.select(`#wk-drag-sort-item-${index}`).boundingClientRect(data => {
					this.moveTop = data.top
					this.moveLeft = data.left
					
					this.moveItemData = this.sortList[index]
					this.activeIndex = index
					
					this.itemWidth = data.width
					this.itemHeight = data.height
					this.showMoveItem = true; // 悬浮开始
					console.log('start move')
					
					clearTimeout(this.dealyTimer)
					this.dealyTimer = null
				}).exec();
			}, this.dealy)
		},
		
		handleTouchmove(evt, index) {
			const touch = evt.touches[0];
			this.moveLeft = touch.clientX - this.itemWidth / 2
			this.moveTop = touch.clientY - this.itemHeight / 2
		},
		
		handleTouchend(evt, index) {
			if (this.dealyTimer) {
				clearTimeout(this.dealyTimer)
				this.dealyTimer = null
			}
			const overIndex = this.findOverIndex()
			
			if (overIndex !== -1) {
				const arr = deepCopy(this.sortList)
				arr[overIndex] = arr.splice(this.activeIndex, 1, arr[overIndex])[0]
				this.handleSort(arr)
			}
			
			this.clearMoveItem()
		},
		
		/**
		 * 悬浮结束
		 */
		clearMoveItem() {
			this.showMoveItem = false
			this.activeIndex = -1
			this.moveLeft = 0
			this.moveTop = 0
		},
		
		// 找到停下的元素的下标
		findOverIndex() {
			for (let i = 0; i < this.allBoundary.length; i++) {
				const item = this.allBoundary[i]
				if (
					this.moveLeft > item.beginX &&
					this.moveLeft < item.endX &&
					this.moveTop > item.beginY &&
					this.moveTop < item.endY
				) {
					return i
				}
			}
			return -1
		}
	}
}